package com.fjn.proxy.dao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class UserDaoImpl implements UserDao{

    @Override
    public int add(int a, int b) {
        System.out.println("add方法执行了");
        return a+b;
    }

    @Override
    public String update(String abc) {
        System.out.println("update方法执行了");
        return abc;
    }
}

class JDCProxy {
    public static void main(String[] args) {
        //代理类和被代理类要使用同一个接口，所以使用的UserDao.class
        Class[] interfaces = {UserDao.class};
        UserDaoImpl userDao = new UserDaoImpl();

        UserDao dao = (UserDao) Proxy.newProxyInstance(JDCProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        Integer a  = dao.add(1,2);
        System.out.println("a");
        System.out.println("===================================");
        String b = "1234567";
        dao.update("1234567");

    }
}

class UserDaoProxy implements InvocationHandler{
//    把创建的是谁的代理对象，把谁传过来
//    有参构造传递
    private Object object;
    public UserDaoProxy(Object object){
        this.object = object;
    }
    //增强的方法（proxy是代理对象，method是调用接口上方法的Method实例，args是传入的参数）
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前做一个处理
        System.out.println("方法之前执行" + method.getName() + "传递的参数"+Arrays.toString(args)); //看看当前执行的是哪个方法和传进来的参数
        //被增强的方法执行
        Object obj = method.invoke(object,args);
        //方法之后做一个处理
        System.out.println("方法之后执行");
        return obj;
    }
}
